From ad11c56ddd1f2008673132c778e19597e4acc14d Mon Sep 17 00:00:00 2001 From: robertlipe Date: Sat, 11 Oct 2014 21:40:49 +0000 Subject: [PATCH] Finish the sub-second support for unicsv... --- gpsbabel/reference/unicsv_subsec.csv | 12 ++++++++++ gpsbabel/testo.d/unicsv.test | 4 ++++ gpsbabel/unicsv.cc | 35 ++++++++++++++-------------- 3 files changed, 33 insertions(+), 18 deletions(-) create mode 100644 gpsbabel/reference/unicsv_subsec.csv diff --git a/gpsbabel/reference/unicsv_subsec.csv b/gpsbabel/reference/unicsv_subsec.csv new file mode 100644 index 000000000..995461e4d --- /dev/null +++ b/gpsbabel/reference/unicsv_subsec.csv @@ -0,0 +1,12 @@ +No,Latitude,Longitude,Name,Date,Time +1,33.784801,-117.474350,"WPT001",2014/09/17,13:20:20.400 +2,33.784801,-117.474342,"WPT002",2014/09/17,13:20:20.600 +3,33.784801,-117.474342,"WPT003",2014/09/17,13:20:20.800 +4,33.784801,-117.474342,"WPT004",2014/09/17,13:20:21 +5,33.784801,-117.474342,"WPT005",2014/09/17,13:20:21.200 +6,33.784801,-117.474335,"WPT006",2014/09/17,13:20:21.400 +7,33.784801,-117.474335,"WPT007",2014/09/17,13:20:21.600 +8,33.784801,-117.474335,"WPT008",2014/09/17,13:20:21.800 +9,33.784805,-117.474327,"WPT009",2014/09/17,13:20:22 +10,33.784805,-117.474327,"WPT010",2014/09/17,13:20:22.200 +11,33.784805,-117.474327,"WPT011",2014/09/17,13:20:22.400 diff --git a/gpsbabel/testo.d/unicsv.test b/gpsbabel/testo.d/unicsv.test index fe131328c..5115002c4 100644 --- a/gpsbabel/testo.d/unicsv.test +++ b/gpsbabel/testo.d/unicsv.test @@ -22,3 +22,7 @@ compare ${TMPDIR}/headerdetection~unicsv.gpx ${REFERENCE}/extensiondata~unicsv.g # check default encoding, i.e. utf-8 in and out. gpsbabel -i gpx -f ${REFERENCE}/unicsv_encoding.gpx -o unicsv -F ${TMPDIR}/unicsv_encoding.csv compare ${TMPDIR}/unicsv_encoding.csv ${REFERENCE}/unicsv_encoding.csv + +# verify fractional second read and writes. +gpsbabel -i unicsv -f ${REFERENCE}/unicsv_subsec.csv -o unicsv -F ${TMPDIR}/unicsv_subsec.csv +compare ${TMPDIR}/unicsv_subsec.csv ${REFERENCE}/unicsv_subsec.csv diff --git a/gpsbabel/unicsv.cc b/gpsbabel/unicsv.cc index f805f8dce..d72928750 100644 --- a/gpsbabel/unicsv.cc +++ b/gpsbabel/unicsv.cc @@ -380,11 +380,11 @@ unicsv_parse_date(const char* str, int* consumed) } static time_t -unicsv_parse_time(const char* str, int* msec, time_t* date) +unicsv_parse_time(const char* str, int* usec, time_t* date) { int hour, min, ct, sec; int consumed = 0; - double ms; + double us; char sep[2]; time_t ldate; @@ -398,16 +398,16 @@ unicsv_parse_time(const char* str, int* msec, time_t* date) *date = ldate; } } - ct = sscanf(str, "%d%1[.://]%d%1[.://]%d%lf", &hour, sep, &min, sep, &sec, &ms); + ct = sscanf(str, "%d%1[.://]%d%1[.://]%d%lf", &hour, sep, &min, sep, &sec, &us); is_fatal(ct < 5, MYNAME ": Could not parse time string (%s).\n", str); if (ct == 6) { - *msec = lround((ms * 1000000)); - if (*msec > 999999) { - *msec = 0; + *usec = lround((us * 1000000)); + if (*usec > 999999) { + *usec = 0; sec++; } } else { - *msec = 0; + *usec = 0; } return ((hour * SECONDS_PER_HOUR) + (min * 60) + (int)sec); @@ -504,7 +504,6 @@ unicsv_compare_fields(const QString& s, const field_t* f) return unicsv_compare_fields(CSTR(s), f); } - static void unicsv_fondle_header(QString s) { @@ -639,7 +638,7 @@ unicsv_parse_one_line(char* ibuf) int checked = 0; time_t date = -1; time_t time = -1; - int msec = -1; + int usec = -1; char is_localtime = 0; garmin_fs_t* gmsd; double d; @@ -837,7 +836,7 @@ unicsv_parse_one_line(char* ibuf) case fld_utc_time: if ((is_localtime < 2) && (time < 0)) { - time = unicsv_parse_time(CSTR(s), &msec, &date); + time = unicsv_parse_time(s, &usec, &date); is_localtime = 0; } break; @@ -916,7 +915,7 @@ unicsv_parse_one_line(char* ibuf) case fld_time: if ((is_localtime < 2) && (time < 0)) { - time = unicsv_parse_time(CSTR(s), &msec, &date); + time = unicsv_parse_time(s, &usec, &date); is_localtime = 1; } break; @@ -954,7 +953,7 @@ unicsv_parse_one_line(char* ibuf) case fld_datetime: if ((is_localtime < 2) && (date < 0) && (time < 0)) { - time = unicsv_parse_time(CSTR(s), &msec, &date); + time = unicsv_parse_time(s, &usec, &date); is_localtime = 1; } break; @@ -1062,8 +1061,8 @@ unicsv_parse_one_line(char* ibuf) break; case fld_gc_exported: { time_t time, date; - int msec; - time = unicsv_parse_time(s, &msec, &date); + int usec; + time = unicsv_parse_time(s, &usec, &date); if (date || time) { gc_data->exported = unicsv_adjust_time(time, &date); } @@ -1071,8 +1070,8 @@ unicsv_parse_one_line(char* ibuf) break; case fld_gc_last_found: { time_t time, date; - int msec; - time = unicsv_parse_time(s, &msec, &date); + int usec; + time = unicsv_parse_time(s, &usec, &date); if (date || time) { gc_data->last_found = unicsv_adjust_time(time, &date); } @@ -1153,8 +1152,8 @@ unicsv_parse_one_line(char* ibuf) } } - if (msec >= 0) { - wpt->creation_time = wpt->creation_time.addMSecs(msec); + if (usec >= 0) { + wpt->creation_time = wpt->creation_time.addMSecs(MICRO_TO_MILLI(usec)); } if (opt_utc) { -- 2.30.2